home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Opus5.5 / ARexx.lha / ARexx / PBar.dopus5 < prev    next >
Text File  |  1996-05-02  |  6KB  |  162 lines

  1. /* Progress-Bar for Directory Opus 5.
  2.    by Leo 'Nudel' Davidson for Gods'Gift Utilities
  3.    email: leo.davidson@keble.oxford.ac.uk  www: http://users.ox.ac.uk/~kebl0364
  4.  
  5. $VER: PBar.dopus5 1.4 (18.8.95)
  6.  
  7.    This ARexx script will add a progress bar (like when deleting files)
  8.    to external commands which are run on all the selected entries in a
  9.    lister.
  10.  
  11. *** Could do with updating for Opus 5.5's new progress bars, although
  12.     it should work as is. If anyone is interested in an update let me know ***
  13.  
  14. Call as:
  15. ------------------------------------------------------------------------------
  16. ARexx    PBar.dopus5 {Qp} "<1>" "<2>"
  17. ------------------------------------------------------------------------------
  18. Where <1> is the AmigaDOS command to be run for each file.
  19.  Insert "!!f!!" (without quotes) where you would like the full path to the
  20.  selected file (you can insert it more than once, if you require).
  21. <2> is the progress window title.
  22.  
  23. If <1> or <2> have any spaces in them, "put quotes around them".
  24.  
  25. The "Do All Files" switch MUST be turned *_OFF_*!!!
  26.  
  27. e.g.
  28. ------------------------------------------------------------------------------
  29. ARexx    DOpus5:ARexx/PBar.dopus5 {Qp} "C:PackIt !!f!! CRUNCH" "Packing files:"
  30. ------------------------------------------------------------------------------
  31.  
  32. Note: The command you use must be able to handle "filenames with quotes".
  33.  
  34. TO DO:
  35. ------
  36. - Convert this to a nice, fast assembler program - once I get to grips with
  37.   how to send Rexx messages via rexxsyslib.library (HELP!).
  38. - Make it rescan all selected entries.
  39.   (Short of making it rescan the entire dir, which you can do as a switch
  40.   within DOpus, I don't think there is a way to emulate "Reload each file"
  41.   via an ARexx script, at least in the current version of DOpus5.)
  42. - Perhaps propper support for all the {} type codes, not just {f}.
  43. - ONLY DIRS and ONLY FILES options.
  44.   (If you don't want it to act on files or on dirs, simply don't select them!)
  45. - Take a filetype-ID so that only files matching it are acted on.
  46.   (this would actually be a pain to impliment - I'm not about to).
  47.  
  48.    v1.02 -> v1.03 - Now uses stem variables for getting the lister handle.
  49.                     Some minor tidying up.
  50.                     Now checks to make sure the DOPUS.x port exists.
  51.     v1.03 -> v1.4 - Now uses Show() instead of ShowList(). (Thanks Stoebi)
  52.                     Style Guide compliant version numbering and $VER string.
  53.  
  54.  
  55. ---- Setup --------------------------------------------------------------------
  56.    You should edit the SepBar below to look right with your output-window
  57.    setup (use the script and you'll see what it does). */
  58. SepBar = "-----------------------------------------------------------------------------------"
  59.  
  60. options results
  61. options FAILAT 99
  62. signal on syntax;signal on ioerr        /* Error trapping */
  63.  
  64. /*- Parse the command-line --------------------------------------------------*/
  65. CmdLine = ARG(1)
  66. DOpusPort = GetCmdWord()
  67. UserCommand = GetCmdWord()
  68. UserTitle = GetCmdWord()
  69.  
  70. If DOpusPort="" THEN Do
  71.     Say "Not correctly called from Directory Opus 5!"
  72.     Say "Load this ARexx script into an editor for more info."
  73.     EXIT
  74.     END
  75. If ~Show("P",DOpusPort) Then Do
  76.     Say DOpusPort "is not a valid port."
  77.     EXIT
  78.     End
  79. Address value DOpusPort
  80.  
  81. If UserTitle="" Then UserTitle = "Doing all files..."
  82.  
  83. lister query source stem source_handle.
  84.  
  85. IF source_handle.count = 0 | source_handle.count = "SOURCE_HANDLE.COUNT" Then Do
  86.     dopus request '"You must have a SOURCE lister!" OK'
  87.     EXIT
  88.     End
  89.  
  90. lister set source_handle.0 busy 1
  91.  
  92. lister query source_handle.0 numselentries    /* Get info about selected */
  93. Lister_NumSelEnt = RESULT            /* entries & path to them */
  94. lister query source_handle.0 path
  95. Lister_Path = Strip(RESULT,"B",'"')
  96.  
  97. If Lister_NumSelEnt = "RESULT" | Lister_Path = "RESULT" Then Do
  98.     lister set source_handle.0 busy 0
  99.     EXIT
  100.     END
  101.  
  102. /*-- The Progress Bar ---------------------------------------------------------
  103. A progress bar will display how many of the selected files have been done.
  104. This means the max-number argument is Lister_NumSelEnt.
  105. For each selected entry, the "Do i..." loop updates the progress bar,
  106. builds and executes the user-defined command, and then de-selects.
  107. -----------------------------------------------------------------------------*/
  108. lister set source_handle.0 progress Lister_NumSelEnt UserTitle
  109.  
  110. Do i=1 to Lister_NumSelEnt
  111.     lister query source_handle.0 firstsel
  112.     Temp_Name = RESULT
  113.     lister select source_handle.0 Temp_Name 0
  114.     Temp_Name = Strip(Temp_Name,"B",'"')
  115.     lister set source_handle.0 progress name Temp_Name
  116.     lister set source_handle.0 progress count i
  117.     lister query source_handle.0 abort
  118.     IF RESULT=1 THEN BREAK        /* If they aborted, break the loop */
  119.  
  120.     Temp_Name = '"'||Lister_Path||Temp_Name||'"'
  121.     Temp_Exec = Upper(UserCommand)
  122.     Do While Index(Temp_Exec,"!!F!!") ~= 0
  123.         Temp_Pos = Index(Temp_Exec,"!!F!!")
  124.         Temp_Exec = DelStr(Temp_Exec,Temp_Pos,"5")
  125.         Temp_Exec = Insert(Temp_Name,Temp_Exec,Temp_Pos-1)
  126.         END
  127.     Address Command Temp_Exec
  128.     Say SepBar
  129.     END
  130.  
  131. /*-- Restore the Lister for normal use --------------------------------------*/
  132. syntax:;ioerr:                /* In case of error, jump here */
  133. lister clear source_handle.0 progress
  134. lister refresh source_handle.0
  135. lister set source_handle.0 busy 0
  136.  
  137. EXIT
  138.  
  139.  
  140. /*- Function for Command-Line parsing -----------------------------------------
  141.  ARexx's "PARSE ARG" is rank. It isn't very good at handling arguments with
  142.  "quotes" (especially when the quotes are optional), and inserts spaces
  143.  where you don't want them sometimes. I don't have the docs to RexxDosSupport,
  144.  so I wrote my own function which extracts the next argument from the string
  145.  "CmdLine", respecting quotes, and not adding extra spaces at either side.
  146. -----------------------------------------------------------------------------*/
  147. GetCmdWord:
  148.     Temp_CmdWord = Word(CmdLine,1)
  149.     CmdLine = DelWord(CmdLine,1,1)
  150.  
  151.     If Left(Temp_CmdWord,1) = '"' Then Do Forever
  152.         If Right(Temp_CmdWord,1) = '"' Then Break
  153.         If Words(CmdLine) = "0" Then Call BadCmd_Quotes
  154.         Temp_CmdWord = Temp_CmdWord||" "||Word(CmdLine,1)
  155.         CmdLine = DelWord(CmdLine,1,1)
  156.         End
  157.     Return Strip(Temp_CmdWord,"B",'"')
  158.  
  159. BadCmd_Quotes:
  160.     dopus request '"PBar.dopus5: Bad Command Line.' || X2C(0A) || 'Unclosed quotes in string." OK'
  161.     EXIT
  162.